home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
dld-3_23.lha
/
dld-3.2.3
/
defs.h
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-30
|
6KB
|
205 lines
/* defs.h -- global definitions. */
/* This file is part of DLD, a dynamic link/unlink editor for C.
Copyright (C) 1990 by W. Wilson Ho.
The author can be reached electronically by how@ivy.ucdavis.edu or
through physical mail at:
W. Wilson Ho
Division of Computer Science
University of California at Davis
Davis, CA 95616
*/
/* This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 1, or (at your option) any
later version. */
#include <a.out.h>
#include <ar.h>
#include <stdio.h>
#include <sys/types.h>
#include <strings.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/param.h>
#include <setjmp.h>
#include "dld.h"
/* Each input file, and each library member ("subfile") being loaded,
has a `file_entry' structure for it.
For files specified by command args, these are contained in the vector
which `file_table' points to.
For library members, they are dynamically allocated,
and chained through the `chain' field.
The chain is found in the `subfiles' field of the `file_entry'.
The `file_entry' objects for the members have `superfile' fields pointing
to the one for the library. */
struct file_entry {
/* Name of this file. */
char *filename;
/* Name to use for the symbol giving address of text start */
/* Usually the same as filename, but for a file spec'd with -l
this is the -l switch itself rather than the filename. */
char *local_sym_name;
/* For library member, points to next entry for next member.
For object or library *file*, points to previously loaded entry */
struct file_entry *chain;
/* number of undefined symbols referenced by this module */
int undefined_symbol_count;
/* chain of file_entry that defines symbols this file references */
struct file_chain *refs;
/* chain of file_entry that references symbols defined in this file */
struct file_chain *refs_by;
/* reference count -- number of entries referenceing myself */
int ref_count;
/* Describe the layout of the contents of the file */
/* The file's a.out header. */
struct exec header;
/* Describe data from the file loaded into core */
/* Symbol table of the file. */
struct nlist *symbols;
/* Size in bytes of string table. */
int string_size;
/* Pointer to the string table.
The string table is not kept in core all the time,
but when it is in core, its address is here. */
char *strings;
/* Relocation information of the file. */
/* Start of this file's text relocation information. */
struct dld_reloc_info *text_reloc;
/* Start of this file's data relocation information. */
struct dld_reloc_info *data_reloc;
/* Relation of this file's segments to the output buffer */
/* Start of this file's text seg in the output file core image. */
int text_start_address;
/* Start of this file's data seg in the output file core image. */
int data_start_address;
/* Start of this file's bss seg in the output file core image. */
int bss_start_address;
/* For library members only */
/* For a library, points to chain of entries for the library members. */
struct file_entry *subfiles;
/* For a library member, offset of the member within the archive.
Zero for files that are not library members. */
int starting_offset;
/* Size of contents of this file, if library member. */
int total_size;
/* For library member, points to the library's own entry. */
struct file_entry *superfile;
/* 1 if file is a library. */
char library_flag;
/* 1 if file's header has been read into this structure. */
char header_read_flag;
/* 1 if this module has all external references resolved */
char all_symbols_resolved_flag;
/* 1 if functions in this module can be safely executed. */
char executable_flag;
/* 1 if this module has already been (soft) unlinked. */
char already_unlink;
/* 1 means search a set of directories for this file. */
/* char search_dirs_flag; */
};
/* format of file_entry chain */
struct file_chain {
struct file_chain *next;
struct file_entry *entry;
};
/* Symbol table */
/* Global symbol data is recorded in these structures,
one for each global symbol.
They are found via hashing in 'symtab', which points to a vector of buckets.
Each bucket is a chain of these structures through the link field. */
typedef
struct glosym
{
/* Pointer to next symbol in this symbol's hash bucket. */
struct glosym *link;
/* Name of this symbol. */
char *name;
/* Value of this symbol as a global symbol. */
long value;
/* Points to the file_entry that defines this symbol */
struct file_entry *defined_by;
/* chain of file_entry that contains reference to this symbol */
struct file_chain *referenced_by;
/* Nonzero means a definition of this global symbol is known to exist.
Library members should not be loaded on its account. */
char defined;
/* Nonzero means a reference to this global symbol has been seen
in a file that is surely being loaded. */
char referenced;
}
symbol;
/* Number of buckets in symbol hash table */
#define TABSIZE 1009
/* this is commonly used in removing single linked-list elements. */
#define del_link_list_elt(head, prev, current, next) { \
if (prev == 0) { \
head = current->next; \
free (current); \
current = head; \
} else { \
prev->next = current->next; \
free (current); \
current = prev->next; \
} }
/* The symbol hash table: a vector of TABSIZE pointers to struct glosym. */
extern symbol *_dld_symtab[TABSIZE];
/* variable for saving the environment */
extern jmp_buf _dld_env;
/* pointer to the lastest (newest) file entry */
extern struct file_entry *_dld_latest_entry;
/* dummy file_entry to hold all "dangling" symbols. */
extern struct file_entry *_dld_dummy_entry;
/* true if the executable flags are up-to-date */
extern char _dld_exec_flags_valid;
extern int _dld_malloc ();
extern symbol *_dld_getsym ();
extern symbol *_dld_getsym_soft ();
extern void _dld_enter_global_ref ();
extern void _dld_unlink_entry ();
extern void _dld_create_dummy_entry ();
extern void _dld_patch_all_files ();